package com.itheima.reggie.demo;

/**
 * 线程容器对象演示
 *
 * @Author Vsunks.v
 * @Date 2023/2/5 16:18
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 线程容器对象演示
 */
public class ThreadLocalDemo {

    // 创建唯一的一个ThreadLocal对象，其泛型为容器将要存储的数据类型。
    public static ThreadLocal<String> tl = new ThreadLocal<>();

    public static void main(String[] args) {
        /*
            效果：
                在一个方法中设置参数，不通过传统传参的方式，在另外一个方法中也可以获取的改参数

            想实现效果，有两个要求：
                1. 多次方法调用是在同一个线程中
                2. 使用的也是同一个线程容器对象（ThreadLocal）

            使用：
                1. 创建唯一的一个ThreadLocal对象，其泛型为容器将要存储的数据类型。
                2. 在想要共享的位置，使用该对象.set(值)；
                3. 在想要使用的位置，使用该对象.get()；

            注意：
                只需要保证是在同一线程中即可，与是否在同一个类中无关

         */
        String arg = "只因你太美";

        // 不通过传参的方式，在test2中使用arg
        // 2. 在想要共享的位置，使用该对象.set(值)；
        System.out.println("0:" + Thread.currentThread().getName());
        tl.set(arg);

        // 验证同一个类中的效果
        // test1();

        // 验证不同类中的效果
        NewClass.test3();

    }

    private static void test1() {
        System.out.println("1:" + Thread.currentThread().getName());
        test2();
    }

    private static void test2() {
        System.out.println("2:" + Thread.currentThread().getName());
        // 3. 在想要使用的位置，使用该对象.get()；
        String str = tl.get();
        System.out.println("str = " + str);
    }
}


class NewClass {
    public static void test3() {
        System.out.println("3:" + Thread.currentThread().getName());
        // 3. 在想要使用的位置，使用该对象.get()；
        String str = ThreadLocalDemo.tl.get();
        System.out.println("str = " + str);
    }

}
